/**
 * @description 将数组按指定大小切分成多个子数组
 * @template T - 数组元素的类型
 * @param {T[]} array - 要切分的源数组
 * @param {number} size - 每个切片的大小
 * @param {Object} [options] - 配置选项
 * @param {boolean} [options.fillRemaining=false] - 是否填充最后一个切片到指定大小
 * @param {T} [options.fillValue] - 填充值，当fillRemaining为true时使用
 * @throws {Error} 当size小于等于0时抛出错误
 * @returns {T[][]} 切分后的二维数组
 * @example
 * // 基本用法
 * arraySlice([1, 2, 3, 4, 5], 2) // [[1, 2], [3, 4], [5]]
 * 
 * // 使用填充选项
 * arraySlice([1, 2, 3], 2, { fillRemaining: true, fillValue: 0 }) // [[1, 2], [3, 0]]
 */
export const arraySlice = <T>(
  array: T[],
  size: number,
  options: { fillRemaining?: boolean; fillValue?: T } = {}
): T[][] => {
  // 参数验证
  if (!Number.isFinite(size) || size <= 0) {
    throw new Error('切片大小必须是大于0的有效数字');
  }

  // 如果数组为空，返回空数组
  if (!array.length) {
    return [];
  }

  const { fillRemaining = false, fillValue } = options;
  const result: T[][] = [];
  
  // 使用更高效的for循环
  for (let i = 0; i < array.length; i += size) {
    const chunk = array.slice(i, i + size);
    
    // 处理最后一个切片的填充
    if (fillRemaining && chunk.length < size && fillValue !== undefined) {
      while (chunk.length < size) {
        chunk.push(fillValue);
      }
    }
    
    result.push(chunk);
  }

  return result;
};

// const arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19];
// arraySlice(arr, 4);
